﻿#pragma once
#include"Common.h"



template<class T>
class ObjectPool
{
	void*& Next(void* cur)
	{
		return *(void**)cur;
	}
public:

	T* New()
	{
		T* obj;
		//优先给自由链表的
		if (_freeList)
		{
			obj = (T*)_freeList;
			//头删
			_freeList = Next(_freeList);
		}
		else
		{
			// 至少存一个指针大小
			size_t objectSize = sizeof(T)<sizeof(void*)?sizeof(void*):sizeof(T);

			// 内存不够申请内存
			if (_remainSize < objectSize)
			{
				//_memory = (char*)malloc(1024 * 8);
				_memory = (char*)SystemAlloc(1024 * 256 >> PAGE_SHIFT);
				
				_remainSize = 1024 * 256;
			}

			// 执行到下面内存一定够
			 obj = (T*)_memory;

			_memory += objectSize;
			_remainSize -= objectSize;

			
			// //越界访问 可能带来问题
			//if (_remainSize < sizeof(T))
			//{
			//	_memory = (char*)malloc(1024*8);
			//	_remainSize = 1024 * 8;
			//}

			//if (_remainSize < 10)
			//{
			//	int c = 0;
			//}

			//obj = (T*)_memory;

			//if (_remainSize >= sizeof(T) && sizeof(T) < sizeof(void*) && _remainSize< sizeof(void*))
			//{
			//	cout << "越界使用" << endl;
			//}

			//size_t objectSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);
			//_memory += objectSize;
			//_remainSize -= objectSize;
		}


		// 显示调用构造函数
		new (obj) T();   

		return obj;
	}

	void Delete(T* obj)
	{
	
		obj->~T();// 析构函数

		// 头插入自由链表
		Next(obj) = _freeList;
		_freeList = obj;
	}

private:
	void* _freeList=nullptr;    //自由链表，优先从自由链表获取对象
	size_t _remainSize=0;		// 剩余字节数
	char* _memory=nullptr;      // 剩余内存指针 使用char方便直接加减操作
};





//struct TreeNode
//{
//	int _val;
//	TreeNode* _left;
//	TreeNode* _right;
//	TreeNode()
//		:_val(0)
//		, _left(nullptr)
//		, _right(nullptr)
//	{}
//};
//
//
//void TestObjectPool()
//{
//	// 申请释放的轮次 
//	const size_t Rounds = 3;
//	// 每轮申请释放多少次 
//	const size_t N = 100000;
//
//
//	//第一次测试
//	size_t begin1 = clock();
//	std::vector<TreeNode*> v1;
//	v1.reserve(N);
//
//	for (size_t j = 0; j < Rounds; ++j)
//	{
//		for (int i = 0; i < N; ++i)
//		{
//			v1.push_back(new TreeNode);
//		}
//		for (int i = 0; i < N; ++i)
//		{
//			delete v1[i];
//		}
//		v1.clear();
//	}
//	size_t end1 = clock();
//
//
//
//	ObjectPool<TreeNode> TNPool;
//	size_t begin2 = clock();
//	std::vector<TreeNode*> v2;
//	v2.reserve(N);
//	for (size_t j = 0; j < Rounds; ++j)
//	{
//		for (int i = 0; i < N; ++i)
//		{
//			v2.push_back(TNPool.New());
//		}
//		for (int i = 0; i < 100000; ++i)
//		{
//			TNPool.Delete(v2[i]);
//		}
//		v2.clear();
//	}
//	size_t end2 = clock();
//
//
//	cout << "new cost time:" << end1 - begin1 << endl;
//	cout << "object pool cost time:" << end2 - begin2 << endl;
//}
//
//
//struct node
//{
//	char s1;
//	char s3;
//	char s2;
//};
//
//void TestObjectPool2()
//{
//	// 申请释放的轮次 
//	const size_t Rounds = 3;
//	// 每轮申请释放多少次 
//	const size_t N = 100000;
//
//	ObjectPool<node> TNPool;
//	size_t begin2 = clock();
//	std::vector<node*> v2;
//	v2.reserve(N);
//	for (size_t j = 0; j < Rounds; ++j)
//	{
//		for (int i = 0; i < N; ++i)
//		{
//			v2.push_back(TNPool.New());
//		}
//		v2.clear();
//	}
//	size_t end2 = clock();
//
//	cout << "object pool cost time:" << end2 - begin2 << endl;
//}